package top.goldenyear.porpoise.common.core.util.io;

import lombok.SneakyThrows;
import cn.hutool.v7.core.data.id.IdUtil;
import cn.hutool.v7.core.io.file.FileNameUtil;
import cn.hutool.v7.core.io.file.FileTypeUtil;
import cn.hutool.v7.core.io.file.FileUtil;
import cn.hutool.v7.core.text.StrUtil;
import cn.hutool.v7.crypto.digest.DigestUtil;

import java.io.ByteArrayInputStream;
import java.io.File;

/**
 * 文件工具类
 *
 * @author Airhead
 */
public class FileUtils extends FileUtil {

  /**
   * 创建临时文件 该文件会在 JVM 退出时，进行删除
   *
   * @param data 文件内容
   * @return 文件
   */
  @SneakyThrows
  public static File createTempFile(String data) {
    File file = createTempFile();
    // 写入内容
    FileUtil.writeUtf8String(data, file);
    return file;
  }

  /**
   * 创建临时文件 该文件会在 JVM 退出时，进行删除
   *
   * @param data 文件内容
   * @return 文件
   */
  @SneakyThrows
  public static File createTempFile(byte[] data) {
    File file = createTempFile();
    // 写入内容
    FileUtil.writeBytes(data, file);
    return file;
  }

  /**
   * 创建临时文件，无内容 该文件会在 JVM 退出时，进行删除
   *
   * @return 文件
   */
  @SneakyThrows
  public static File createTempFile() {
    // 创建文件，通过 UUID 保证唯一
    File file = File.createTempFile(IdUtil.simpleUUID(), null);
    // 标记 JVM 退出时，自动删除
    file.deleteOnExit();
    return file;
  }

  /**
   * 生成文件路径
   *
   * @param content      文件内容
   * @param originalName 原始文件名
   * @return path，唯一不可重复
   */
  public static String generatePath(byte[] content, String originalName) {
    String sha256Hex = DigestUtil.sha256Hex(content);
    // 情况一：如果存在 name，则优先使用 name 的后缀
    if (StrUtil.isNotBlank(originalName)) {
      String extName = FileNameUtil.extName(originalName);
      return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName;
    }
    // 情况二：基于 content 计算
    return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content));
  }
}
